Plan de Desarrollo Técnico Detallado v2.0

Módulo: Funcionalidad Integral del Panel del Profesor

1. Directrices Fundamentales del Proyecto

Principios Rectores de Desarrollo

Este documento es la guía maestra. Todo el desarrollo se regirá por los siguientes principios, además de los ya establecidos en directrices.txt.


  • Autorización Explícita Requerida: No se escribirá, modificará u optimizará ninguna línea de código sin su autorización previa y explícita para cada tarea específica.
  • Metodología de Desarrollo Iterativo: Seguiremos un flujo de trabajo riguroso: Análisis y Propuesta ➔ Autorización ➔ Codificación ➔ Prueba y Retroalimentación ➔ Corrección Autorizada.
  • Estándares de Codificación: El código será limpio, con encabezados y secciones comentadas, y seguirá las mejores prácticas y estándares definidos.
  • Seguridad como Prioridad: Se utilizará $mysqli->real_escape_string() para toda entrada que vaya a una consulta SQL. Se implementarán transacciones para operaciones críticas.
  • Claridad sobre Complejidad: Se favorecerán soluciones directas y claras, evitando AJAX/JSON a menos que sea indispensable y explícitamente autorizado.

Contenido del Informe

2. Arquitectura y Lógica Inicial del Script

Esta sección define la base operativa del archivo aula_virtual_profesor_pp.php.

2.1. Obtención del Contexto (Curso y Profesor)

Objetivo: Determinar de forma segura qué curso y profesor se están visualizando.

Lógica de Negocio:

  1. Obtener ID del Curso: El script buscará el curso_id en la superglobal $_GET. Si no lo encuentra, buscará en $_SESSION.
  2. Validación: Si no se encuentra un curso_id válido en ninguna de las dos fuentes, el script mostrará un mensaje de error claro (ej: "Acceso denegado. No se ha especificado un curso.") y detendrá su ejecución.
  3. Obtener ID del Profesor: El profesor_id se obtendrá de la sesión del usuario autenticado (ej: $_SESSION['usuario_id']).
  4. Verificación de Permisos: Se ejecutará una consulta para confirmar que el profesor_id está asignado al curso_id a través de la tabla cursos_profesores. Si no hay una asignación válida, se negará el acceso.

Tablas Implicadas: cursos_profesores.

3. Desarrollo Detallado del Dashboard (Vista Principal)

Análisis componente por componente de la vista #view-dashboard.

3.1. Título y Tarjetas de Estadísticas

Objetivo: Proveer una vista rápida de los indicadores clave de rendimiento del curso.

  • Título del Curso: Se obtendrá de cursos_sence.nombre_actividad usando el $curso_id de contexto y se imprimirá en el <h1>.
  • Card "Alumnos Inscritos": Se contará el total de registros en inscripciones_curso donde curso_id = $curso_id y estado = 'activo'.
  • Card "Avance Promedio":
    1. Contar total de subtemas obligatorios: SELECT COUNT(id) FROM subtemas_curso WHERE curso_id = $curso_id AND es_obligatorio_sence = 1;
    2. Para cada alumno, contar sus subtemas completados: SELECT COUNT(id) FROM subtemas_alumno WHERE alumno_id = ? AND modo = 'completado';
    3. Se calculará el promedio de los porcentajes individuales en PHP.
  • Card "Mensajes Nuevos": Se contará el total de registros en mensajes_alumno_profesor donde profesor_id = $profesor_id, curso_id = $curso_id y respondido = 0.
  • Card "Alumnos en Línea": Se definirá una variable $intervalo_online_minutos = 60;. La consulta contará los alumnos únicos en accesos_aula_virtual donde la fecha_acceso sea dentro de ese intervalo.

3.2. Feed "Actividad Reciente"

Objetivo: Mostrar una cronología de las últimas interacciones de los alumnos.

Lógica de Negocio:

  1. Recopilar Eventos: Se ejecutarán dos consultas SQL para obtener los dos tipos de eventos solicitados:
    • Ingresos al Aula: SELECT alumno_id, fecha_acceso AS fecha_evento, 'ingreso' AS tipo FROM accesos_aula_virtual WHERE curso_id = ? ORDER BY fecha_acceso DESC LIMIT 10;
    • Videos Vistos: SELECT sa.alumno_id, sa.fecha_visto AS fecha_evento, 'video' AS tipo, sc.titulo AS detalle FROM subtemas_alumno sa JOIN subtemas_curso sc ON sa.subtema_id = sc.id WHERE sa.curso_id = ? ORDER BY sa.fecha_visto DESC LIMIT 10;
  2. Unificar y Ordenar: Los resultados de ambas consultas se fusionarán en un único array PHP. Este array se ordenará por fecha_evento de forma descendente.
  3. Presentación: Se iterará sobre los N primeros elementos del array ordenado. Para cada uno, se consultará alumnos.nombre y alumnos.apellido_paterno y se construirá una frase descriptiva. Ejemplo: "Juan Pérez completó el video 'Conceptos Clave'".

3.3. Panel "Pizarra del Curso"

Objetivo: Mostrar los anuncios más importantes para el curso.

Lógica de Negocio: Se consultará la tabla pizarra_curso filtrando por curso_id. Se ordenará por destacado DESC y luego por fecha_publicacion DESC, con un LIMIT 2 para mostrar los dos más relevantes. Los anuncios con destacado = 1 recibirán una clase CSS especial (`mensaje-destacado`) para su presentación visual. El botón "Publicar Nuevo Anuncio" enlazará a ingresa_mensaje.php?curso_id=$curso_id.

4. Desarrollo Detallado de la Ficha de Progreso del Alumno

Análisis de la vista #view-progreso-alumno, que se activa al hacer clic en un alumno.

4.1. Tarjeta de Perfil y Contacto del Alumno

Objetivo: Mostrar la información identificativa y de contacto del alumno seleccionado.

Lógica de Negocio: Cuando se carga la vista con un $_GET['alumno_id'], se consulta la tabla alumnos para obtener nombre, apellido_paterno, correo, telefono, y foto_perfil. El estado ("En Curso", "Egresado", etc.) se obtendrá de inscripciones_curso.modo. El "Último acceso" provendrá de la consulta más reciente en accesos_aula_virtual para ese alumno.

4.2. Tarjetas de Acciones Rápidas y sus Modales

Objetivo: Proporcionar accesos directos a interacciones clave con el alumno.

  • Mensajes: El botón "Ver y Responder" abrirá el modal #mensajesModal.
    • Poblado del Modal: Se consultará mensajes_alumno_profesor para listar el historial de conversación entre $profesor_id y $alumno_id.
    • Lógica del Badge: El contador de mensajes nuevos (<span class="badge bg-danger">) se calculará contando los mensajes de ese alumno donde leido = 'no'.
    • Lógica de Envío: El formulario "Escribir Nueva Respuesta" dentro del modal enviará los datos a un script que creará un nuevo registro o actualizará la respuesta en la tabla.
  • Calificaciones: El botón "Ver Notas" abrirá el modal #evaluacionesModal.
    • Poblado del Modal: Se consultará la tabla notas_alumno para listar todas las evaluaciones y notas formales del alumno, asociadas a su inscripción.
  • Evaluar Alumno: El botón "Asignar estrellas" abrirá el modal #calificaModal.
    • Lógica del Modal: Este modal presenta una evaluación cualitativa. Las estrellas se manejan con JavaScript para la interacción visual.
    • Lógica de Guardado: Al pulsar "Guardar Evaluación", los valores de las 3 categorías de estrellas y el comentario se enviarán a un script. **Propuesta:** estos datos se guardarán en una nueva tabla, ej. evaluaciones_cualitativas_profesor, que contendrá id, alumno_id, profesor_id, curso_id, participacion, motivacion, iniciativa, comentarios, fecha_evaluacion.

4.3. Tabla "Detalle de Avance por Subtema"

Objetivo: Mostrar el progreso granular del alumno en cada actividad del curso.

Lógica de Negocio:

  1. Obtener todos los temas y subtemas del curso desde temas_curso y subtemas_curso.
  2. Para cada subtema, hacer un LEFT JOIN a la tabla subtemas_alumno filtrando por el alumno_id actual.
  3. Poblar la Tabla:
    • Subtema: subtemas_curso.titulo.
    • Progreso: Se calculará el porcentaje basado en subtemas_alumno.tiempo_visualizacion y subtemas_curso.duracion_minutos.
    • Estado: Se mostrará un badge (insignia) de color según el valor de subtemas_alumno.modo ('Completado', 'En Progreso', 'No Iniciado').
    • Fecha Completado: Se mostrará subtemas_alumno.fecha_visto si el estado es 'Completado'.

5. Plan para "Gestión de Contenido" y sus Modales

Esta es una de las áreas más complejas y su desarrollo se abordará en fases posteriores.

6. Plan para "Análisis de Evaluaciones"

Esta vista mostrará un resumen de las calificaciones que los alumnos han otorgado a los contenidos.

7. Plan para "Centro de Mensajes"

Será el inbox centralizado del profesor para todas sus conversaciones del curso.